//package com.zhouyu.decoder;
//
//import com.zhouyu.commonapi.resbody.BussiAssert;
//import com.zhouyu.commonapi.resbody.ResponseEnum;
//import com.zhouyu.msgdto.MyMsg;
//import io.netty.buffer.ByteBuf;
//import io.netty.channel.ChannelHandlerContext;
//import io.netty.handler.codec.LengthFieldBasedFrameDecoder;
//import lombok.extern.log4j.Log4j2;
//import org.springframework.stereotype.Component;
//import org.springframework.util.Assert;
//
//import java.nio.charset.Charset;
//
///**
// * @Author:zhouyu
// * @create: 15:59 2019/9/30
// * @Description: 自定义基于长度的拆包器
// */
//@Component
//@Log4j2
//public class MyLengthFieldBasedFrameDecoder extends LengthFieldBasedFrameDecoder {
//    /**
//     *
//     * [-头 4字节-]   [type 1字节]     [bodylenth 2字节]
//     * 74 70 73 6c     01                00   1d
//     *
//     * [-----------------------------------body---------------------------------------------]
//     * 01 38 36 34 32 38 37 30 33 38 32 37 34 39 34 38 30 19 01 24 16 15 30 64 1e 01 40 00 00
//     *
//     * [-crc-]  [--iot--]
//     *  59 23   69 6f 74
//     *
//     *
//     */
//    // 编码格式
//    private final Charset charset = Charset.forName("UTF-8");
//
//    /**
//     * 修正包体字节长度，
//     * 1.有时候我们习惯把header字节长度值也算在长度域的值里面,
//     * 这个时候需要去掉header字节长度，就需要往后偏移一段距离才是真正的包体内容。
//     * 2.有时候会在包尾放置一些crc校验字段，长度域的长度又不包含包尾校验，这个时候也要修正长度域。
//     */
//    private static final int LENGTH_ADJUSTMENT=5;
//
//    //头部的长度
//    private static final int LENGTH_HEADER = 4;
//
//    //长度域的偏移，从0开始偏移多少字节就到了长度域=4(头)+1(type)
//    private static final int LENGTH_FEILD_OFFSET = 5;
//
//    //长度域的字节数
//    private static final int LENGTH_FEILD_LENTH = 2;
//
//    //帧数据最大长度
//    private static final int MAXFRAMELENGTH = 100*1024;
//
//    //从0开始丢弃多少字节的数据
//    private static final int INITIAL_BYTES_TO_STRIP = 0;
//
//    /**
//    * 计算公式
//     * lengthAdjustment = 数据包总长度- lengthFieldOffset - lengthFieldLength - 长度域的值
//    * */
//
//    public MyLengthFieldBasedFrameDecoder() {
//        super(MAXFRAMELENGTH, LENGTH_FEILD_OFFSET, LENGTH_FEILD_LENTH,LENGTH_ADJUSTMENT,INITIAL_BYTES_TO_STRIP);
//    }
//
//    @Override
//    protected Object decode(ChannelHandlerContext ctx, ByteBuf in){
//        Assert.notNull(in,"无可读数据");
//        if (in.readableBytes() < LENGTH_HEADER) {
//            BussiAssert.assertBussiException(ResponseEnum.BYTE_LENGTH_SHORT);
//        }
//        if (in.readableBytes() > MAXFRAMELENGTH) {
//            BussiAssert.assertBussiException(ResponseEnum.BYTE_LENGTH_LONG);
//        }
//        //头
//        String header = in.readCharSequence(LENGTH_HEADER, charset).toString();
//
//        //type
//        byte type = in.readByte();
//
//        //body长度
//        short length = in.readShort();
//
//        //可读取的长度不足
//        if (in.readableBytes() < length) {
//            BussiAssert.assertBussiException(ResponseEnum.BODY_LENGTH_ILLEGAL);
//        }
//        ByteBuf byteBuf = in.readBytes(length);
//        byte[] bytes = new byte[byteBuf.readableBytes()];
//        byteBuf.readBytes(bytes);
//        String body = new String(bytes, charset);
//        MyMsg myMsg = new MyMsg();
//        myMsg.setHeader(header);
//        myMsg.setType(type);
//        myMsg.setData(body);
//        return myMsg;
//    }
//}
